package club.jdiy.utils.reflex;

import ognl.Ognl;
import ognl.OgnlException;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * JDiy 一个简洁的EL表达式解析工具类.
 *
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20200517
 */
@SuppressWarnings("ALL")
public class ElParser {
    private static final Pattern pattern = Pattern.compile("(?<=(?<!\\\\)\\$\\{)(.*?)(?=(?<!\\\\)\\})");
    private final Map<String, Object> model;

    /**
     * 构造方法. 传入的Map为模型数据。由您根据需要任意定义.
     *
     * @param model 模型数据. 根据需要自行定义.
     */
    public ElParser(Map<String, Object> model) {
        this.model = model == null ? new HashMap<>() : model;

    }

    /**
     * 添加模型数据变量值.
     *
     * @param var 变量名称
     * @param o   变量值
     * @return ElParser
     */
    public ElParser addVariable(String var, Object o) {
        this.model.put(var, o);
        return this;
    }

    /**
     * 移除模型数据变量值.
     *
     * @param var 变量名称
     * @return ElParser
     */
    public ElParser removeVariable(String var) {
        this.model.remove(var);
        return this;
    }

    /**
     * EL表达式解析.
     *
     * @param str 带El表达式的内容。
     * @return 解析后的内容
     */
    public String parse(String str) {
        if (str == null || "".equals(str)) return str;
        Matcher matcher = pattern.matcher(str);
        String ret = str;
        while (matcher.find()) {
            try {
                String eg = matcher.group();
                String ev = Ognl.getValue(eg, model).toString();
                ret = ret.replaceAll("\\$\\{" + eg + "\\}", ev);
            } catch (OgnlException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }
}
